package com.arquitecturajava;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;

public class dataBaseConnection<T> {

    private static final Logger log = Logger.getLogger(dataBaseConnection.class.getPackage().getName());

    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost/arquitecturajava";
    private static final String USER = "root";
    private static final String PASSWORD = "adminadmin";

    public int modificarRegistro(String consultaSQL) throws SQLException {
        Connection conexion = null;
        Statement sentencia = null;
        int filasAfectadas = 0;
        try {
            Class.forName(DRIVER);
            conexion = DriverManager.getConnection(URL,
                    USER, PASSWORD);
            sentencia = conexion.createStatement();
            filasAfectadas = sentencia.executeUpdate(consultaSQL);
        } catch (ClassNotFoundException e) {
            log.error("Error de acceso al driver! " + e.getMessage());
            System.out.println("Error driver" + e.getMessage());
        } catch (SQLException e) {
            log.error("Error en SQL! " + e.getMessage());
            System.out.println("Error de SQL" + e.getMessage());

        } finally {
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (SQLException e) {
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (SQLException e) {
                }
            }
        }
        return filasAfectadas;
    }

    @SuppressWarnings("unchecked")
    public List<T> seleccionarRegistros(String consultaSQL, Class<T> clase) {

        Connection conexion = null;
        Statement sentencia = null;
        ResultSet filas = null;
        ArrayList<T> listaDeObjetos = new ArrayList<T>();

        try {
            Class.forName(DRIVER);
            conexion = DriverManager.getConnection(URL, USER, PASSWORD);
            sentencia = conexion.createStatement();
            filas = sentencia.executeQuery(consultaSQL);
            
            while (filas.next()) {
                T objeto = (T) Class.forName(clase.getName()).newInstance();
                Method[] metodos = objeto.getClass().getDeclaredMethods();
                for (Method metodo : metodos) {
                    if (metodo.getName().startsWith("set")) {
                        metodo.invoke(objeto, filas.getString(metodo.getName().substring(3)));
                    }
                    if (objeto.getClass().getName().equals("java.lang.String")) {
                        objeto = (T) filas.getString(1);
                    }
                }
                listaDeObjetos.add(objeto);
            }

        } catch (SecurityException e) {
            log.error("Error de seguridad" + e.getMessage());
        } catch (IllegalArgumentException e) {
            log.error("Error en el tipo de argumentos" + e.getMessage());

        } catch (ClassNotFoundException e) {

            log.error("Error no se encuentra la clase" + e.getMessage());

        } catch (SQLException e) {
            log.error("Error de SQL" + e.getMessage());
        } catch (InstantiationException e) {
            log.error("Error de instanciacion" + e.getMessage());
        } catch (IllegalAccessException e) {
            log.error("Error de acceso" + e.getMessage());
        } catch (InvocationTargetException e) {
            log.error("Error de invocacion" + e.getMessage());
        }

        return listaDeObjetos;

    }

}
